/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import web.util.Constantes;
import com.thoughtworks.xstream.XStream;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.Solicitudserayudante;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.*;
import java.io.IOException;
import java.sql.Date;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
//import java.util.*;
import java.util.ArrayList;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import org.apache.batik.transcoder.TranscoderException;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.ImprimirContratos;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;
import wasolicitudesfiec.registros.Rg_CandidatoAyudante;
import wasolicitudesfiec.xsl.pdf.Transformador;

/**
 *
 * @author kabad
 */
public class CTRL_EnvioContratos extends CTRL_Base {

    private ImprimirContratos gui;
    private String nombreActividad = Constantes.SolicitarAyudantes.imprimirContratos;

    public CTRL_EnvioContratos(ImprimirContratos gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public void inicializar() throws MensajeException {
        ArrayList<Rg_CandidatoAyudante> listaRg_CandidatoAyudante = new ArrayList<Rg_CandidatoAyudante>();
        String nombreInstanciaProf;
        Solicitudayudantia solicitudAyudantia;
        TipoAyudantia tipoAyudantia;
        try {
            nombreInstanciaProf = this.getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProf);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitudAyudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel3(idSolicitud);

            tipoAyudantia = logica.leerTipoAyudantia(solicitudAyudantia);
            // obtener nombre y tipo de ayudnatia
            gui.getLabel2().setText(tipoAyudantia.getNombre() + " ");
            String nombreAyudantia = "";
            if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {
                nombreAyudantia = solicitudAyudantia.getMateria().getNombre();
                gui.getLabel3().setText(nombreAyudantia);
            } else {
                nombreAyudantia = solicitudAyudantia.getAyudantiavaria().getNombre();
                gui.getLabel3().setText(nombreAyudantia);
            }
            Rg_CandidatoAyudante rg_CandidatoAyudante;
            Vector<Solicitudserayudante> lista = solicitudAyudantia.getListaSolicitudserayudante();
            String financiero = logica.leerConfiguracionPorNombre(Constantes.Configuracion.VicepresidenteFinanciero.getNombreEnBD()).getValor();
            String administrativo = logica.leerConfiguracionPorNombre(Constantes.Configuracion.VicepresidenteAdministrativo.getNombreEnBD()).getValor();
                    if (lista != null) {
                for (Solicitudserayudante object : lista) {
                    if (object.getRespuestaConfirmacion().equals(Constantes.Atributo.DecisionConfirmacion.Aceptar.toString())) {
                        rg_CandidatoAyudante = new Rg_CandidatoAyudante();
                        rg_CandidatoAyudante.setSolicitudserayudante(object);

                        rg_CandidatoAyudante.setSeleccionado(object.getSeleccionado());
                        rg_CandidatoAyudante.setNombreInstancia(solicitudAyudantia.getNombreinstanciaproceso());
                        rg_CandidatoAyudante.setFinanciero(financiero);
                        rg_CandidatoAyudante.setAdministrativo(administrativo);
                        String path = generarInforme(rg_CandidatoAyudante);
                        rg_CandidatoAyudante.setPathContrato(Constantes.Rutas.rutaArchivos + path);
                        listaRg_CandidatoAyudante.add(rg_CandidatoAyudante);
                    }
                }
            }
            gui.getMenu().setTitulo(Constantes.Modelo.modelo_SolicitarAyudantes + "_" + idSolicitud + ": " + nombreActividad);

            gui.getDp_AyudantesContratados().setListaRg_CandidatoAyudante(listaRg_CandidatoAyudante);
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }

    }

    //genera pdf informe para sta
    private String generarInforme(Rg_CandidatoAyudante registro) throws SQLException, TransformerConfigurationException, IOException, TransformerException, TranscoderException, Exception {
        Transformador transformador = new Transformador();
        String path = "";
        String actividad = registro.getSolicitudserayudante().getSolicitudayudantia().getActividadarealizar();
        Vector<String> tokens = new Vector<String>();
        String token = "";
        String[] palabras = actividad.split("[ ]");


        for (int i = 0; i < palabras.length; i++) {
            if ((token + palabras[i]).length() < 90) {
                token = token + palabras[i] + " ";
            } else {
                tokens.add(token);
                token = "";
                i--;
            }
        }
        //para lo que queda al final
        tokens.add(token);
        //setear el contenido de cada linea de actividad a realizar
        if (tokens.size() > 0) {
            registro.setActividad1(tokens.get(0));
        }
        if (tokens.size() > 1) {
            registro.setActividad2(tokens.get(1));
        }
        if (tokens.size() > 2) {
            registro.setActividad3(tokens.get(2));
        }
        if (tokens.size() > 3) {
            registro.setActividad4(tokens.get(3));
        }

          String pattern = "dd/MM/yyyy";
            SimpleDateFormat sdf = new SimpleDateFormat();
            sdf.applyPattern(pattern);

      registro.setFechaInicio(sdf.format(registro.getSolicitudserayudante().getSolicitudayudantia().getFechainicioayudantia()));
      registro.setFechaFin(sdf.format(registro.getSolicitudserayudante().getSolicitudayudantia().getFechafinayudantia()));
      registro.setFecha(sdf.format(registro.getSolicitudserayudante().getSolicitudayudantia().getFechamodificacion()));
        //conversion a svg usando xstream

        XStream xstream = new XStream();
        xstream.alias("contrato", Rg_CandidatoAyudante.class);
        String xml = xstream.toXML(registro);
        TipoAyudantiaEnum tipoAyudantia;
        if (registro.getSolicitudserayudante().getSolicitudayudantia().getFkIdMateria() != 0) {
            tipoAyudantia = TipoAyudantiaEnum.ACADEMICA;
        } else {
            tipoAyudantia = TipoAyudantiaEnum.ACTIVIDADES_VARIAS;
        }
        path = transformador.doIt(Constantes.Modelo.modelo_SolicitarSerAyudante, xml, registro.getSolicitudserayudante().getNombreinstanciaproceso(), this.externalContext, tipoAyudantia);
        return path.replaceAll(" ", "%20");
    }

    public void realizarActividad() throws MensajeException {
        // terminar el proceso
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitudAyudantia;

        Solicitudayudantia solicitud;
        try {
            nombreInstanciaProceso = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);
            if (!(actividad != null && (actividad.getState() == hero.interfaces.Constants.Nd.READY || actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt(prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitud);
            solicitud.setEstado(Constantes.EstadoSolicitud.Terminada.toString());
            int idSecretaria = new Integer(logica.leerPersonaPorUsuario(usuario.getUsuario()).getIdPersona());
            solicitud.setFkIdSecretaria(idSecretaria);

            solicitud = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitud);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud.getIdSolicitudAyudantia() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);

        //falta  enviar correos a estdiantes de que sus contratos ya fueron enviados. Enviar mail a los implicados 
        //diciendo que los contratos fueron enviados y enlistando los nuevos ayudantes.creo que correo a toda fiec
        } catch (MensajeException exception) {
            throw exception;
        } catch (Exception exception) {
            exception.printStackTrace();
            Logger.getLogger(CTRL_SeleccionDeAyudantes.class.getName()).log(Level.SEVERE, null, exception);

            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }
}
